package model;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Set;

/**
 * Classe de estrutura para o cliente da lavanderia
 * 
 * @author Dayane
 * @author Pedro Candido
 *
 * @since 28/04/12
 */

public class Cliente implements Serializable{

	/**
	 * Atributo para classe poder ser seiralizada
	 */
	private static final long serialVersionUID = 6363441492048416261L;
	
	/**
	 * Usa cpf como chave primaria do cliente (baseado em banco de dados).
	 * Sua posicao no HashMap a qual ele pertente.
	 */
	private String cpf;
	
	/**
	 * Guarda, para facilitar a vida, a proxima chave primaria de pedidos.
	 * Ou seja, quando for adicionar um pedido, essa chave � usada como key do hash de pedidos desse cliente
	 * e eh incrementada para o proximo valor (baseado em banco de dados).
	 */
	private int nextPedidoKey = 1;
	
	/**
	 * Atributos da classe qua guardam as informacoes do cliente
	 */
	private String nome;
	private String endereco;
	private String telefone;
	
	/**
	 * Lista de pedidos do cliente. Acessando essa lista temos todos os pedidos que o cliente ja fez
	 * e podemos adicionar novos nela.
	 */
	private HashMap<Integer, Pedido> pedidoList = new HashMap<Integer, Pedido>();

	/**
	 * Construtor completo da classe, para instancia-la com todos os atributos preenchidos
	 * 
	 * @param String nome
	 * @param String cpf
	 * @param String endereco
	 * @param String telefone
	 * 
	 */
	public Cliente(String nome, String cpf, String endereco, String telefone) {
		this.nome = nome;
		this.cpf = cpf;
		this.endereco = endereco;
		this.telefone = telefone;
	}
	
	/**
	 * Construtor para criar a classe quando ainda n�o tem os valores dos atributos
	 * para poder preencher ao instancia-la
	 * 
	 */
	public Cliente(){}

	/**
	 * Retorna a chave do proximo pedido a ser incluido.
	 * 
	 * @return int nextPedidoKey
	 */
	public int getNextPedidoKey(){
		return this.nextPedidoKey;
	}

	/*
	 * Getters e setters gerais
	 */	
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCpf() {
		return this.cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getEndereco() {
		return this.endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getTelefone() {
		return this.telefone;
	}
	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public HashMap<Integer, Pedido> getPedidoList() {
		return pedidoList;
	}
	/**
	 * Adiciona um pedido a lista de pedidos do cliente
	 * @param Pedido pedido
	 */
	public void addPedido(Pedido pedido){
		pedido.setKey(this.nextPedidoKey);
		this.pedidoList.put(this.nextPedidoKey, pedido);
		this.nextPedidoKey++;
	}
	
	/**
	 * Imprime o Cliente instanciado e sua lista de pedidos e a lista de produtos por pedido
	 * 
	 * @param boolean imprimirPedidos
	 * @return void
	 */
	public void imprimir(boolean imprimirPedidos) {
		System.out.println("CPF: " + this.getCpf());
		System.out.println("Nome: " + this.getNome());
		System.out.println("Endereco: " + this.getEndereco());
		System.out.println("Telefone: " + this.getTelefone());
		
		if(imprimirPedidos){
			System.out.println("Pedidos: ");
			this.imprimirPedidos();
		}
		System.out.println("_____________________________________________________________________________");
	}
	
	public void imprimirPedidos(){
		Set<Integer> pedidosKeys = this.getPedidoList().keySet();
		for (Integer key : pedidosKeys){
			this.getPedidoList().get(key).imprimir(true); // True para imprimir produtos
			System.out.println("");
		}
	}

}